package aop;

import java.util.Date;

/**
 * @Author 肖地洋
 * @Date 2022/5/4 15:19
 *
 *
 * service类的代码不修改，也能增加功能，输出时间，事务
 * 动态代理：可以在程序的执行过程中创建代理对象，通过代理对象执行方法，给目标类增加额外的功能（功能增强）
 *         JDK动态代理步骤：
 *                       1、创建目标类，SomeserviceImpl，给它doSome，doOther方法增加输出时间和提交事务功能
 *                       2、创建InvocationHandler接口的实现类，在这个类的实现给目标方法增加功能
 *                       3、使用JDK的类Proxy，创建代理对象，实现创建对象的能力
 *        CGlib动态代理：
 *                       第三方工具库，创建代理对象，原理是继承，通过继承目标类，创建子类，
 *                       子类就是代理对象，要求目标类不能是final的，方法也不能是final的
 *AOP： 面向切面编程，基于动态代理的，可以使用jdk，cglib两种代理方式
 *      aop就是动态代理的规范化，把动态代理的实现步骤，方式都定义好了，
 *      让开发人员用一种统一的方式使用动态代理
 *AOP的实现：
 *         1、Spring：spring也实现了aop的规范，能做aop的工作，
 *                 spring主要在事务处理时使用aop
 *                 我们项目开发中很少使用spring的aop实现，因为spring的aop比较笨重
 *         2、aspectJ：一个开源的专门做aop的框架，spring框架中集成了aspectJ框架，通过spring就可以使用aspctJ的功能
 *                   aspectJ框架实现aop有两种方式：
 *                                             1、 使用XML的配置文件
 *                                             2、使用注解，项目开发中一般都使用注解，aspectj有五个注解
 *AsoectJ的使用：
 *             1、切面的执行时间：这个执行时间在规范中叫做Advice（通知，增强）在aspectj框架中使用注解表示：
 *                也可以使用xml配置文件中的标签
 *                @Before @AfterReturning @Around @AfterThrowing @After
 *             2、切面执行的位置：
 *
 *
 */
public class SomeServideImpl implements SomeService{

    @Override
    public void doSome() {

        //输出方法开始时间
//       1、 System.out.println("非业务方法，方法的执行时间："+new Date());
//       2、 ServiceUtil.doLog();
        System.out.println("doSome");
        System.out.println("非业务方法：方法执行完毕，提交事务");

        //提交事务

    }

    @Override
    public void doOther() {
        //输出方法开始时间
//        System.out.println("非业务方法，方法的执行时间："+new Date());
        System.out.println("doOther");
        //提交事务
//        System.out.println("非业务方法：方法执行完毕，提交事务");

    }
}
